package com.howcode.aqchat.service.service.impl;

import com.howcode.aqchat.common.constant.AQRedisKeyPrefix;
import com.howcode.aqchat.common.utils.JwtUtil;
import com.howcode.aqchat.framework.redis.starter.RedisCacheHelper;
import com.howcode.aqchat.service.service.ITokenHolder;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

@Slf4j
@Service
public class TokenHolderImpl implements ITokenHolder {

    // 令牌秘钥
    @Value("${token.secret}")
    private String secret;

    // 令牌有效期（默认30分钟）
    @Value("${token.expireTime}")
    private long expireTime;

    @Autowired
    private RedisCacheHelper redisCacheHelper;


    /**
     * 生成 token 字符串
     * @param userId
     * @return
     */
    @Override
    public String createToken(String userId) {
        return JwtUtil.createJWT(secret,expireTime,userId);
    }

    /**
     * 判断token是否存在与有效
     * @param jwtToken
     * @return
     */
    @Override
    public boolean checkToken(String userId,String jwtToken) {
        if (StringUtils.isEmpty(jwtToken)) {
            return false;
        }
        String cacheToken = redisCacheHelper.getCacheObject(getTokenKey(userId), String.class);
        return StringUtils.isNotBlank(cacheToken) && jwtToken.equals(cacheToken);
    }

    /**
     * 根据token获取会员id，根据用户 id 查询数据库获取用户基本信息
     * @return
     */
    public String getUserIdByJwtToken(String jwtToken) {
        Claims claims = getClaimsByToken(jwtToken);
        if (claims == null){
            return "";
        }
        return (String) claims.get("userId");
    }

    /**
     * 根据token获取会员id，根据用户 id 查询数据库获取用户基本信息
     * @return
     */
    public Claims getClaimsByToken(String jwtToken) {
        if (StringUtils.isEmpty(jwtToken)) {
            return null;
        }
        Jws<Claims> claimsJws =
                Jwts.parser().setSigningKey(secret).parseClaimsJws(jwtToken);
        return claimsJws.getBody();
    }




    private String getTokenKey(String userId)
    {
        return AQRedisKeyPrefix.LOGIN_TOKEN_KEY + userId;
    }
}
